package cn.thinkluck.pattern.proxy.dynamic.jdk;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 代理处理程序
 */
@Slf4j
class CacheInvocationHandler implements InvocationHandler {
    // 被代理对象
    private final DataQuery delegate;
    private final Map<String, String> cache = new HashMap<>();

    /**
     * 构造函数
     *
     * @param delegate 初始化要被代理的对象
     */
    public CacheInvocationHandler(DataQuery delegate) {
        this.delegate = delegate;
    }

    /**
     * @param proxy  代理对象
     * @param method 调用的方法
     * @param args   方法参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //1. 判断是哪个方法
        if ("query".equals(method.getName())) {
            String key = args[0].toString();
            //2. 查询缓存
            String data = cache.get(key);
            if (data != null) {
                log.info("命中缓存");
                return data;
            }
            log.info("未命中缓存");
            //3. 未命中缓存 调用被代理对象查询数据库
            data = (String) method.invoke(delegate, args);
            cache.put(key, data);
            return data;
        }
        //4. 如果不是要被代理的方法，就维持原样调用
        return method.invoke(delegate, args);
    }
}
